﻿Public Enum Bedingungsarten
    TagGleich
    TagGrößer
    TagKleiner
    TagMal
    TagMalImmer
    Besetzt
    Sieg
    Feuerladung
    LandkartenZustand
    CountLandkarteZustand
    GebäudeZerstört
    SpielerBesiegt
    InBereich
    EinheitZerstört
    FeldLeer
    Zufall
    VariableGleich
    VariableKleiner
    VariableGrößer
    VariableGrößerGleich
End Enum
Public Enum Ereignisarten
    EinheitenSpawn
    Dialog
    SetKP
    SetKO
    Schadenswelle
    landkarte
    Gewonnen
    SetFeuerladung
    AddWarteEinheit
    RemoveBlockierteEinheit
    setFabrikFonds
    NeutralerGebäudeAngriff
    NewVariable
    SetVariable
    IncreaseVariable
    Besiegt
End Enum




Public Class objScript
    Public Bedingungen() As objBedingung = {}
    Public Ereignisse() As objEreignis = {}
    Public Desc As String = ""



    Public Shared Function getBedingungsart(ByVal Str As String) As Bedingungsarten
        Dim ind As Integer = frmScriptWriter.getConditionIndString(Str)
        Return ind - 1 'Auch wenn's nur ein String ist.

    End Function
    Public Shared Function getEreignisart(ByVal Str As String) As Ereignisarten
        Dim ind As Integer = frmScriptWriter.getEventIndString(Str)
        Return ind - 1
    End Function

    Public Sub addBedingung(ByVal Bedingungsart As Bedingungsarten, ByVal Parameter() As String)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New objBedingung(Bedingungsart, Parameter)
    End Sub
    Public Sub addBedingung(ByVal Bedingungsart As Bedingungsarten)
        Dim b As New objBedingung
        b.Bedingungsart = Bedingungsart
        b.setDefaultValues(True)

        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = b
    End Sub
    Public Sub addEreignis(ByVal Ereignisart As Ereignisarten, ByVal Parameter() As String)
        addEreignis(New objEreignis(Ereignisart, Parameter))
    End Sub
    Public Sub addEreignis(ByVal Ereignisart As Ereignisarten)
        Dim b As New objEreignis
        b.Ereignisart = Ereignisart
        b.setDefaultValues(True)

        addEreignis(b)
    End Sub
    Private Sub addEreignis(ByVal Ereignis As objEreignis)
        If Ereignis.Ereignisart = Ereignisarten.Dialog Then
            'Beim Dialog gibt's noch ne Ausnahme.
            If Ereignis.Parameter.Length < 6 Then
                Array.Resize(Ereignis.Parameter, 6) '6 ist neuerdings ein Minimum
                Ereignis.Parameter(5) = Ereignis.Parameter(3)
            End If

            Dim Dialog As objEreignis = getDialog()
            If Dialog IsNot Nothing Then
                'Es gibt schon ein dialog, also
                Dialog.addfolgeDialog(Ereignis)
                Exit Sub
            End If
        End If
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = Ereignis
    End Sub

    Private Function getDialog() As objEreignis
        For i = Ereignisse.Length - 1 To 0 Step -1
            If Ereignisse(i) IsNot Nothing Then
                If Ereignisse(i).Ereignisart = Ereignisarten.Dialog Then Return Ereignisse(i) 'Das ist der erste (bzw letze) Dialog
            End If
        Next
        Return Nothing 'nichts gefunden.
    End Function
End Class

Public Class objBedingung
    Public Parameter() As String
    'Public ParameterAnz As Integer

    Public Bedingungsart As Bedingungsarten
    Public Sub New(ByVal Bedingungsart As Bedingungsarten, ByVal Parameter() As String)
        Me.Bedingungsart = Bedingungsart
        setDefaultValues(True)
        For i = 0 To Parameter.Length - 1
            Me.Parameter(i) = Parameter(i)
        Next
        'Me.Parameter = Parameter
        'ParameterAnz = Parameter.Length
    End Sub
    Public Sub New(ByVal Bedingungsart As Bedingungsarten)
        Me.Bedingungsart = Bedingungsart
        setDefaultValues(True)
    End Sub
    Public Sub New()

    End Sub

    Public Sub setDefaultValues(ByVal Resize As Boolean)
        Select Case Me.Bedingungsart
            Case Bedingungsarten.Besetzt
                Array.Resize(Parameter, 4)
                Parameter(0) = "0"
                Parameter(1) = "0"
                Parameter(2) = "1"
                Parameter(3) = "0"
            Case Bedingungsarten.CountLandkarteZustand
                Array.Resize(Parameter, 4)
                Parameter(0) = "0"
                Parameter(1) = "1"
                Parameter(2) = "1"
                Parameter(3) = "3"
            Case Bedingungsarten.EinheitZerstört
                Array.Resize(Parameter, 3)
                Parameter(0) = "0"
                Parameter(1) = "0"
                Parameter(2) = "0"
            Case Bedingungsarten.FeldLeer
                Array.Resize(Parameter, 3)
                Parameter(0) = "0"
                Parameter(1) = "0"
                Parameter(2) = "0"
            Case Bedingungsarten.Feuerladung
                Array.Resize(Parameter, 4)
                Parameter(0) = "0"
                Parameter(1) = "0"
                Parameter(2) = "1"
                Parameter(3) = "0"
            Case Bedingungsarten.GebäudeZerstört
                Array.Resize(Parameter, 3)
                Parameter(0) = "0"
                Parameter(1) = "0"
                Parameter(2) = "0"
            Case Bedingungsarten.InBereich
                Array.Resize(Parameter, 6)
                Parameter(0) = "0"
                Parameter(1) = "0"
                Parameter(2) = "1"
                Parameter(3) = "1"
                Parameter(4) = "0"
                Parameter(5) = "1"
            Case Bedingungsarten.LandkartenZustand
                Array.Resize(Parameter, 2)
                Parameter(0) = "0"
                Parameter(1) = "3"
            Case Bedingungsarten.Sieg
                Array.Resize(Parameter, 1)
                Parameter(0) = "A"
            Case Bedingungsarten.SpielerBesiegt
                Array.Resize(Parameter, 1)
                Parameter(0) = "1"
            Case Bedingungsarten.TagGleich
                Array.Resize(Parameter, 3)
                Parameter(0) = "1"
                Parameter(1) = "0"
                Parameter(2) = "1"
            Case Bedingungsarten.TagGrößer
                Array.Resize(Parameter, 3)
                Parameter(0) = "1"
                Parameter(1) = "0"
                Parameter(2) = "1"
            Case Bedingungsarten.TagKleiner
                Array.Resize(Parameter, 3)
                Parameter(0) = "1"
                Parameter(1) = "0"
                Parameter(2) = "1"
            Case Bedingungsarten.TagMal
                Array.Resize(Parameter, 3)
                Parameter(0) = "1"
                Parameter(1) = "0"
                Parameter(2) = "1"
            Case Bedingungsarten.TagMalImmer
                Array.Resize(Parameter, 3)
                Parameter(0) = "1"
                Parameter(1) = "5"
                Parameter(2) = "0"
            Case Bedingungsarten.Zufall
                Array.Resize(Parameter, 1)
                Parameter(0) = "50"
            Case Bedingungsarten.VariableGleich
                Array.Resize(Parameter, 2)
                Parameter(1) = "10"
                Parameter(0) = "New Integer"
            Case Bedingungsarten.VariableKleiner
                Array.Resize(Parameter, 2)
                Parameter(1) = "10"
                Parameter(0) = "New Integer"
            Case Bedingungsarten.VariableGrößer
                Array.Resize(Parameter, 2)
                Parameter(1) = "10"
                Parameter(0) = "New Integer"
            Case Bedingungsarten.VariableGrößerGleich
                Array.Resize(Parameter, 2)
                Parameter(1) = "10"
                Parameter(0) = "New Integer"
        End Select
    End Sub
    Public Function Clone() As objBedingung
        Dim nBed As New objBedingung()
        nBed.Parameter = Parameter.Clone
        nBed.Bedingungsart = Bedingungsart
        Return nBed
    End Function

    ''' <summary>
    ''' schreibt eine Zeile die in einer Script-Datei gelesen werden kann.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Output() As String
        Dim Zeile As String = ""

        Select Case Bedingungsart
            Case Bedingungsarten.Besetzt, Bedingungsarten.CountLandkarteZustand, Bedingungsarten.EinheitZerstört, Bedingungsarten.FeldLeer, Bedingungsarten.Feuerladung, Bedingungsarten.GebäudeZerstört, Bedingungsarten.InBereich, Bedingungsarten.LandkartenZustand, Bedingungsarten.Sieg, Bedingungsarten.SpielerBesiegt, Bedingungsarten.Zufall
                Zeile = Bedingungsart.ToString + ":"
            Case Bedingungsarten.TagGleich
                Zeile = "Tag:"
            Case Bedingungsarten.TagGrößer
                Zeile = "Tag>"
            Case Bedingungsarten.TagKleiner
                Zeile = "Tag<"
            Case Bedingungsarten.TagMal
                Zeile = "Tag*"
            Case Bedingungsarten.TagMalImmer
                Zeile = "NachXZügenImmer:"
            Case Else
                Zeile = Bedingungsart.ToString + ":"
        End Select

        For i = 0 To Parameter.Length - 1
            Zeile += Parameter(i) + "|"
        Next
        Zeile = Zeile.Remove(Zeile.Length - 1)
        Return Zeile
    End Function
End Class

Public Class objEreignis
    Public folgeDialog As objEreignis = Nothing

    Public Parameter() As String
    ' Public ParameterAnz As Integer

    Public Ereignisart As Ereignisarten

    Public Sub New(ByVal Ereignisart As Ereignisarten, ByVal Parameter() As String)
        Me.Ereignisart = Ereignisart
        setDefaultValues(True)
        For i = 0 To Parameter.Length - 1
            Me.Parameter(i) = Parameter(i)
        Next
    End Sub
    Public Sub New(ByVal Ereignisart As Ereignisarten)
        Me.Ereignisart = Ereignisart
        setDefaultValues(True)
    End Sub
    Public Sub New()

    End Sub

    Public Sub addFolgeDialog(ByVal Dialog As objEreignis)
        If folgeDialog Is Nothing Then
            folgeDialog = Dialog
        Else
            folgeDialog.addFolgeDialog(Dialog)
        End If
    End Sub
    Public Sub setDefaultValues(ByVal Resize As Boolean)
        Array.Resize(Parameter, 10)
        Select Case Me.Ereignisart
            Case Ereignisarten.AddWarteEinheit
                Array.Resize(Parameter, 4)
                Parameter(0) = "0"
                Parameter(1) = "0"
                Parameter(2) = "1"
                Parameter(3) = "0"
            Case Ereignisarten.Dialog
                Array.Resize(Parameter, 6)
                Parameter(0) = "ANDY"
                Parameter(1) = "1"
                Parameter(2) = "0"
                Parameter(3) = ""
                Parameter(4) = ""
                Parameter(5) = ""
            Case Ereignisarten.EinheitenSpawn
                Array.Resize(Parameter, 7)
                Parameter(0) = "INF"
                Parameter(1) = "0"
                Parameter(2) = "0"
                Parameter(3) = "1"
                Parameter(4) = "100"
                Parameter(5) = "FALSE"
                Parameter(6) = "0"
            Case Ereignisarten.Gewonnen
                Array.Resize(Parameter, 1)
                Parameter(0) = "A"
            Case Ereignisarten.landkarte
                Array.Resize(Parameter, 2)
                Parameter(0) = "MGewonnen"
                Parameter(1) = "0"
            Case Ereignisarten.NeutralerGebäudeAngriff
                Array.Resize(Parameter, 2)
                Parameter(0) = "1"
                Parameter(1) = "TRUE"
            Case Ereignisarten.RemoveBlockierteEinheit
                Array.Resize(Parameter, 2)
                Parameter(0) = "INF"
                Parameter(1) = Armeen.OS.ToString
            Case Ereignisarten.Schadenswelle
                Array.Resize(Parameter, 2)
                Parameter(0) = "1"
                Parameter(1) = "2"
            Case Ereignisarten.setFabrikFonds
                Array.Resize(Parameter, 3)
                Parameter(0) = "0"
                Parameter(1) = "0"
                Parameter(2) = "10000"
            Case Ereignisarten.SetFeuerladung
                Array.Resize(Parameter, 4)
                Parameter(0) = "0"
                Parameter(1) = "0"
                Parameter(2) = "1"
                Parameter(3) = "0"
            Case Ereignisarten.SetKO
                Array.Resize(Parameter, 3)
                Parameter(0) = "1"
                Parameter(1) = "0"
                Parameter(2) = "ANDY"
            Case Ereignisarten.SetKP
                Array.Resize(Parameter, 4)
                Parameter(0) = "0"
                Parameter(1) = "0"
                Parameter(2) = "10"
                Parameter(3) = "0"
            Case Ereignisarten.SetVariable
                Array.Resize(Parameter, 2)
                Parameter(0) = "New Varaible"
                Parameter(1) = "0"
            Case Ereignisarten.NewVariable
                Array.Resize(Parameter, 2)
                Parameter(0) = "New Varaible"
                Parameter(1) = "0"
            Case Ereignisarten.IncreaseVariable
                Array.Resize(Parameter, 2)
                Parameter(0) = "New Varaible"
                Parameter(1) = "1"
            Case Ereignisarten.Besiegt
                Array.Resize(Parameter, 1)
                Parameter(0) = 1
        End Select
    End Sub
    Public Function Clone() As objEreignis
        Dim nBed As New objEreignis
        If Parameter Is Nothing Then nBed.Parameter = Nothing Else nBed.Parameter = Parameter.Clone
        nBed.folgeDialog = folgeDialog
        nBed.Ereignisart = Ereignisart
        Return nBed
    End Function

    ''' <summary>
    ''' schreibt eine Zeile die in einer Script-Datei gelesen werden kann.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Output() As String
        Dim Zeile As String = ""

        Select Case Ereignisart
            Case Ereignisarten.AddWarteEinheit, Ereignisarten.Gewonnen, Ereignisarten.NeutralerGebäudeAngriff, Ereignisarten.RemoveBlockierteEinheit, Ereignisarten.Schadenswelle, Ereignisarten.setFabrikFonds, Ereignisarten.SetFeuerladung, Ereignisarten.SetKO, Ereignisarten.SetKP, _
                Ereignisarten.NewVariable, Ereignisarten.SetVariable, Ereignisarten.IncreaseVariable, Ereignisarten.Besiegt
                Zeile = Ereignisart.ToString + ":"
            Case Ereignisarten.Dialog
                Zeile = "Dialog2:"
            Case Ereignisarten.EinheitenSpawn
                Zeile = "EinheitE:"
            Case Ereignisarten.landkarte
                Zeile = "landkarte|"
            Case Else
                Zeile = Ereignisart.ToString + ":"
        End Select
        For i = 0 To Parameter.Length - 1
            Zeile += Parameter(i) + "|"
        Next
        Zeile = Zeile.Remove(Zeile.Length - 1)
        If folgeDialog IsNot Nothing Then
            'es gibt noch einen folgedialog, also sollte er einfach anschließend seine sachen reinschreiben.
            Zeile += Environment.NewLine + folgeDialog.Output
        End If
        Return Zeile
    End Function
    
End Class